package com.soyhon.ds.sort 
{
	/**
	 * ...
	 * @author Silvester Han
	 */
	public class SortSlgorithms
	{
		/**
		 * 构造函数
		 */
		public function SortSlgorithms() 
		{
			
		}
		/**
		 * 快速排序需要传入两个指针min，max，和一个需要排序的对象
		 * <p>可以设置一个快速排序的基准枢纽<code> pivot</code>,
		 * 以这个基准进行左右两边比较；如果左边递增的数比基准小，则原地不动；
		 * 反之，则这两个数进行交换。如果右边递减的数比基准大，则原地不动，
		 * 反之，则两个数进行交换。</P>
		 * @param	min 递增的起点
		 * @param	max 递减的起点
		 * @param	object 排序的对象
		 */
		public static function quickSort(min:int, max:int, object:*):void 
		{
			var l:int = min;
			var r:int = max;
			var pivot:int;
			//min<max，判断每次递归，如果相等了则结束递归
			if (min < max )
			{
				pivot = object[r];
				while (l < r)
				{
					//如果l < r ，并且在l递增的过程中一直小于pivot基准，则原地不动。
					while (l < r && object[l] < pivot) l++;
					//函数执行到这里说明object[l] > pivot，所以替换掉object[r] = object[l];然后在进行递减一次。
					if (l < r ) object[r--] = object[l];
					// 如果l < r，并且r在递减的过程中一直大宇pivot基准，则原地不动。
					while (l < r && object[r] > pivot) r--;
					//函数执行到这里说明object[r] < pivot,替换同理，然后判断l<r，则继续进行基于基准的大小的判断分组。
					if (l < r) object[l++] = object[r];
				}
			//如果l>=r则说明第一轮分组结束，以r或者l这个对应的索引赋值pivot。
			object[l] = pivot;
			//然后以l或者r为基准进行下一轮的递归。左右的递归和右边的递归。
			quickSort(min, l - 1,object);
			quickSort(l + 1, max,object);
			}
		}
	}
}